package br.com.lojapi.dao;

import br.com.lojapi.bean.Endereco;
import br.com.lojapi.bean.Pessoa;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Aluno
 */
public class PessoaDAOImp implements PessoaDAO {

    @Override
    public Object salvar(Object obj) throws Exception {
        Pessoa pessoa = (Pessoa) obj;
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;
        EnderecoDAO enderecoDAO = new EnderecoDAOImp();
        try {
            String SQL = "INSERT INTO pessoa(nome, email, telefone) "
                    + "VALUES(?, ?, ?)";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS);
            ps.setString(1, pessoa.getNome());
            ps.setString(2, pessoa.getEmail());
            ps.setString(3, pessoa.getTelefone());
            ps.executeUpdate();
            rs = ps.getGeneratedKeys();
            rs.next();// para entrar na dentro do resultados
            pessoa.setId(rs.getInt(1));
            //chama as daos de endereco e usuario para salvar em sua tabelas 
            //passando o id de pessoa
            enderecoDAO.salvar(pessoa);
        } catch (SQLException se) {
            throw new Exception("Erro ao tentar inserir dados na pessoa" + se.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps);
        }
        return pessoa;
    }

    @Override
    public void alterar(Object obj) throws Exception {
        Pessoa pessoa = (Pessoa) obj;
        PreparedStatement ps = null;
        Connection conn = null;
        EnderecoDAO enderecoDAO = new EnderecoDAOImp();
        try {
            String SQL = "UPDATE pessoa SET nome=?, email=?, telefone=? WHERE id=?";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(SQL);
            ps.setString(1, pessoa.getNome());
            ps.setString(2, pessoa.getEmail());
            ps.setString(3, pessoa.getTelefone());
            ps.setInt(4, pessoa.getId());
            ps.executeUpdate();
            enderecoDAO.alterar(pessoa);
        } catch (SQLException se) {
            throw new Exception("Erro ao tentar atualizar dados" + se.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps);
        }
    }

    @Override
    public void excluir(int id) throws Exception {
        PreparedStatement ps = null;
        Connection conn = null;
        try {
            String SQL = "DELETE FROM pessoa WHERE id=?";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(SQL);
            ps.setInt(1, id);
            ps.executeUpdate();
        } catch (SQLException se) {
            throw new Exception("Erro ao tentar excluir dados"
                    + se.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps);
        }
    }

    @Override
    public Object procurar(Integer id) throws Exception {
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;
        Pessoa pessoa = null;
        try {
            conn = FabricaConexao.getConnection();
            String consulta = "SELECT * FROM pessoa = ?";
            ps = conn.prepareStatement(consulta);
            ps.setInt(1, id);
            rs = ps.executeQuery();
            if (rs.next()) {
                pessoa = new Pessoa();
                pessoa.setId(rs.getInt("p.id"));
                pessoa.setNome(rs.getString("nome"));
                pessoa.setEmail(rs.getString("email"));
                pessoa.setTelefone(rs.getString("telefone"));
            }
        } catch (Exception e) {
            System.out.println("Erro ao tentar procurar " + e.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps, rs);
        }
        return pessoa;
    }

    @Override
    public List<Object> listar() throws Exception {
        PreparedStatement psmt = null;
        Connection conn = null;
        ResultSet rs = null;
        Pessoa pessoa = null;
        Endereco endereco = null;
        List pessoas = new ArrayList();
        try {
            conn = FabricaConexao.getConnection();
            psmt = conn.prepareStatement("SELECT * FROM pessoa p JOIN endereco e on e.idPessoa = p.id");
            rs = psmt.executeQuery();
            while (rs.next()) {
                pessoa = new Pessoa();
                endereco = new Endereco();
                pessoa.setId(rs.getInt("p.id"));
                pessoa.setNome(rs.getString("nome"));
                pessoa.setEmail(rs.getString("email"));
                pessoa.setTelefone(rs.getString("telefone"));
                endereco.setId(rs.getInt("e.id"));
                endereco.setRua(rs.getString("rua"));
                endereco.setNumero(rs.getString("numero"));
                endereco.setBairro(rs.getString("bairro"));
                endereco.setCidade(rs.getString("cidade"));
                endereco.setEstado(rs.getString("estado"));
                endereco.setPais(rs.getString("pais"));
                pessoa.setEndereco(endereco);
                pessoas.add(pessoa);
            }
        } catch (Exception e) {
            System.out.println("erro ao consultar todos pessoa: "
                    + e.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, psmt, rs);
        }
        return pessoas;
    }
}